package cqrtplm.util;

import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.util.Base64;
import java.util.UUID;

/**
 * 文件转换工具类 - 将纯Base64字符串转换为MultipartFile
 */
public class Base64ToMultipartFileUtil {

    /**
     * 将纯Base64字符串转换为MultipartFile
     *
     * @param base64Data 纯Base64编码的字符串（不包含data:type;base64,前缀）
     * @param fileName   原始文件名（可选，如果为空则自动生成）
     * @param fileType   文件MIME类型（可选，如 "video/mp4", "image/png"等）
     * @return MultipartFile 对象
     * @throws IllegalArgumentException 如果base64数据为空或无效
     */
    public static MultipartFile convert(String base64Data, String fileName, String fileType) {
        // 1. 校验基础数据
        if (base64Data == null || base64Data.trim().isEmpty()) {
            throw new IllegalArgumentException("Base64数据不能为空");
        }

        // 2. 解码Base64字符串
        byte[] decodedBytes;
        try {
            decodedBytes = Base64.getDecoder().decode(base64Data);
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("无效的Base64字符串", e);
        }

        // 3. 处理文件名（如果未提供则生成随机名）
        String finalFileName = fileName;
        if (finalFileName == null || finalFileName.isEmpty()) {
            finalFileName = generateRandomFileName(fileType);
        }

        // 4. 处理文件类型（如果未提供则使用默认类型）
        String finalFileType = (fileType != null && !fileType.isEmpty()) ? fileType : "application/octet-stream";

        // 5. 创建并返回MockMultipartFile
        return new MockMultipartFile(
                finalFileName,           // name - 表单字段名
                finalFileName,    // originalFilename - 文件名
                finalFileType,    // contentType - MIME类型
                decodedBytes      // content - 文件字节内容
        );
    }

    /**
     * 简化方法 - 只传入Base64数据，其他使用默认值
     */
    public static MultipartFile convert(String base64Data) {
        return convert(base64Data, null, null);
    }

    /**
     * 简化方法 - 传入Base64数据和文件名
     */
    public static MultipartFile convert(String base64Data, String fileName) {
        return convert(base64Data, fileName, null);
    }

    /**
     * 生成随机文件名（根据文件类型添加后缀）
     */
    private static String generateRandomFileName(String fileType) {
        String baseName = UUID.randomUUID().toString();
        
        if (fileType != null) {
            // 根据MIME类型添加文件后缀
            switch (fileType) {
                case "video/mp4":
                    return baseName + ".mp4";
                case "video/avi":
                    return baseName + ".avi";
                case "video/quicktime":
                    return baseName + ".mov";
                case "image/jpeg":
                    return baseName + ".jpg";
                case "image/png":
                    return baseName + ".png";
                case "application/pdf":
                    return baseName + ".pdf";
                // 可以继续添加其他类型...
                default:
                    // 如果类型未知，尝试从类型中提取后缀
                    if (fileType.contains("/")) {
                        String extension = fileType.split("/")[1];
                        return baseName + "." + extension;
                    }
            }
        }
        
        return baseName; // 没有后缀的随机名
    }
}